/*****************************************************************************
  Copyright ?2002-2004 by Martin Cook. All rights are reserved. If you like
  this code then feel free to go ahead and use it. The only thing I ask is 
  that you don't remove or alter my copyright notice. Your use of this 
  software is entirely at your own risk. I make no claims about the 
  reliability or fitness of this code for any particular purpose. If you 
  make changes or additions to this code then please clearly mark your code 
  as yours. If you have questions or comments then please contact me at: 
  martin@codegator.com
  
  Have Fun! :o)
*****************************************************************************/

using System;
using System.Data;
using System.Security.Principal;
using System.Threading;

using CG.Security.Configuration;
using CG.Security.Data;

namespace CG.Security
{

	/// <summary>
	/// Provides static methods that supply helper utilities for managing 
	/// associations between users and roles.
	/// </summary>
	public sealed class UserRoleManager
	{
		
		// ******************************************************************
		// Attributes.
		// ******************************************************************

		#region Attributes

		/// <summary>
		/// The data object used to interface with the database.
		/// </summary>
		private static IUserRoleData c_userRoleData;

		#endregion

		// ******************************************************************
		// Constructors.
		// ******************************************************************

		#region Constructors

		/// <summary>
		/// Class constructor.
		/// </summary>
		static UserRoleManager()
		{
			c_userRoleData = DataManager.UserRoleData;
		} // End UserRoleManager()

		#endregion

		// ******************************************************************
		// Public methods.
		// ******************************************************************

		#region Public methods

		/// <summary>
		/// Creates a new association between a user and a role. Note that 
		/// the calling user must be a member of the 'Admin' role in order to 
		/// perform this action.
		/// </summary>
		/// <param name="userID">The identifier for the user.</param>
		/// <param name="roleID">The identifier for the role.</param>
		public static void Create(
			int userID,
			int roleID
			)
		{

			// Check the role of the user before we proceed.
			if (!Thread.CurrentPrincipal.IsInRole("Admin"))
				throw new SecurityException("User must be in the Admin role to perform this action!");

			// Create the association in the database.
			c_userRoleData.Create(
				userID,
				roleID
				);

		} // End Create()

		// ******************************************************************

		/// <summary>
		/// Deletes an association between a user and a role. Note that 
		/// the calling user must be a member of the 'Admin' role in order to 
		/// perform this action.
		/// </summary>
		/// <param name="userID">The identifier for the user.</param>
		/// <param name="roleID">The identifier for the role.</param>
		public static void Delete(
			int userID,
			int roleID
			)
		{

			// Check the role of the user before we proceed.
			if (!Thread.CurrentPrincipal.IsInRole("Admin"))
				throw new SecurityException("User must be in the Admin role to perform this action!");

			// Delete the association in the database.
			c_userRoleData.Delete(
				userID,
				roleID
				);

		} // End Delete()

		// ******************************************************************

		/// <summary>
		/// Returns a list of all the users associated with the specified role.
		/// </summary>
		/// <param name="userID">The identifier for the user.</param>
		/// <returns>A DataSet containing all the users associated with the 
		/// specified role.</returns>
		public static System.Data.DataSet FindByRole(
			int roleID
			)
		{

			// Get the list of associations from the database.
			DataSet ds = c_userRoleData.FindByRole(
				roleID
				);

			// Ensure the dataset has a consistant name.
			ds.DataSetName = "UserRoleData";

			// Ensure the table has a consistant name.
			ds.Tables[0].TableName = "cg_security_user_role";

			return ds;

		} // End FindByRole()

		// ******************************************************************

		/// <summary>
		/// Returns a list of all the roles associated with the specified user.
		/// </summary>
		/// <param name="roleID">The identifier for the role.</param>
		/// <returns>A DataSet containing all the roles associated with the 
		/// specified user.</returns>
		public static System.Data.DataSet FindByUser(
			int userID
			)
		{

			// Get the list of associations from the database.
			DataSet ds = c_userRoleData.FindByUser(
				userID
				);

			// Ensure the dataset has a consistant name.
			ds.DataSetName = "UserRoleData";

			// Ensure the table has a consistant name.
			ds.Tables[0].TableName = "cg_security_user_role";

			return ds;

		} // End FindByUser()

		#endregion

	} // End clas UserRoleManager

} // End namespace CG.Security
